import { DynamicModule, Module } from '@nestjs/common'
import { ConfigModule, ConfigService } from '@nestjs/config'
import { CoreConfigService } from './core-config.service'
import { CoreConfigLoader } from './core-config-loadger'

/**
 * 核心配置模块
 */
@Module({})
export class CoreConfigModule {
  /**
   * 用于全局注册的静态方法
   * @param option 配置选项
   * @returns 返回一个动态模块
   */
  static forRoot(option: CoreConfigModuleOption): DynamicModule {
    return {
      global: true,
      module: this,
      imports: [
        ConfigModule.forRoot({
          isGlobal: true,
          load: [() => CoreConfigLoader.loadConfig(option.directory)],
        }),
      ],
      providers: [
        {
          provide: CoreConfigService,
          useFactory(configService: ConfigService) {
            return new CoreConfigService(configService, option.config)
          },
          inject: [ConfigService],
        },
      ],
      exports: [CoreConfigService],
    }
  }
}

/**
 * 配置模块选项
 */
export interface CoreConfigModuleOption {
  /**
   * 配置文件目录
   */
  directory?: string
  /**
   * 配置文件对象
   */
  config: Function
}
